/**
 * 给定一个N，两种操作：
 * 1. 付出X代价，将N变成N/A
 * 2. 付出Y代价，掷一个骰子，等概率得到1-6点，将N变成N/点数
 * 问将N变为0的最小期望是多少
 * 设D[N]是N到0的期望，边界D0=0
 * 对操作1： D[N] = X + D[N/A]
 * 对操作2： D[N] = Y + (D[N]+D[N/2]+...+D[N/6])/6
 * 因此 D[N] = 6Y/5 + (D[N/2]+...+D[N/6])/5
 * 
 * 则真正的 D[N] = min(D1, D2)
 * 做一个递归记忆化实现即可
 * 因为 N/a/b = N/(ab)，所以经过的数是有数的
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;
using vll = vector<llt>;

template<typename T>
void input(vector<T> & a, int n){
    a.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> a[i];
    return;
}

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
    for(auto & i : v) is >> i;
    return is;
}

llt N;
int A;
Real X, Y;

__gnu_pbds::gp_hash_table<llt, Real> D;

Real dfs(llt n){
    auto it = D.find(n);
    if(it != D.end()) return it->second;

    Real ans = 1E100;
    ans = min(ans, X + dfs(n / A));
    auto tmp = 6.L * Y + dfs(n / 2) + dfs(n / 3) + dfs(n / 4) + dfs(n / 5) + dfs(n / 6);
    tmp /= 5.L;
    ans = min(ans, tmp);
    return D[n] = ans;
}

void work(){
    D[0] = 0;
    cin >> N >> A >> X >> Y;
    auto ans = dfs(N);
    cout << fixed << setprecision(13) << ans << endl;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}